package ejb.session;

import ejb.*;
import facade.ProjetoFacade;
import facade.RequerimentoHoraExtraFacade;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import javax.ejb.*;

public class GerenciaProjetoBean implements SessionBean {
    
  private SessionContext context;
    
    // <editor-fold defaultstate="collapsed" desc="EJB infrastructure methods. Click the + sign on the left to edit the code.">;

    // TODO Add code to acquire and use other enterprise resources (DataSource, JMS, enterprise bean, Web services)
    // TODO Add business methods or web service operations

    /**
     * @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)
     */
    public void setSessionContext(SessionContext aContext) {
        context = aContext;
    }
    
    /**
     * @see javax.ejb.SessionBean#ejbActivate()
     */
    public void ejbActivate() {
        
    }
    
    /**
     * @see javax.ejb.SessionBean#ejbPassivate()
     */
    public void ejbPassivate() {
        
    }
    
    /**
     * @see javax.ejb.SessionBean#ejbRemove()
     */
    public void ejbRemove() {
        
    }
    
    // </editor-fold>;

  public void ejbCreate() { }

  public void comecarSemana(String idProjeto, int semana, int cargaAlocada) {
      try {
          CargaSemanalProjetoLocalHome home = Util.getCargaSemanalProjetoHome();
          CargaSemanalProjetoLocal csp = home.create(null);
          csp.setCargaAlocada(cargaAlocada);
          csp.setIdProjeto(Util.getProjetoHome().findByPrimaryKey(idProjeto));

          Collection c = Util.getFuncionarioHome().findAllItems2();
          for (Iterator it = c.iterator(); it.hasNext();) {
            FuncionarioLocal f = (FuncionarioLocal)it.next();
            if (f.getIdProjeto().getId().equals(idProjeto)) {
              CargaSemanalFuncionarioLocalHome home1 = Util.getCargaSemanalFuncionarioHome();
              CargaSemanalFuncionarioLocal csf = home1.create(Util.nextId());
              csf.setCargaCumprida(0);
              csf.setCargaExtra(0);
              csf.setIdFuncionario(f);
              csf.setSemana(semana);
            }
          }
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

  public void fecharSemana(String idProjeto, int semana) {
      try {
          ProjetoLocal proj = Util.getProjetoHome().findByPrimaryKey(idProjeto);
          int precoHora = proj.getPrecoPorHora();
          int horasTotal = 0;
          Collection func = proj.getFuncionarioCollection();
          Iterator it = func.iterator();
          while(it.hasNext()) {
              FuncionarioLocal funclocal = (FuncionarioLocal) it.next();
              Collection cargas = funclocal.getCargaSemanalFuncionarioCollection();
              for(Iterator carga_i=cargas.iterator();carga_i.hasNext();){
                  CargaSemanalFuncionarioLocal carga_j = (CargaSemanalFuncionarioLocal) carga_i;
                  if(carga_j.getSemana()==semana){
                      horasTotal+=carga_j.getCargaCumprida(); break;
                  }
              }
          }
          int precoTotal = horasTotal*precoHora;
          FaturaLocalHome flh = Util.getFaturaHome();
          FaturaLocal fatura = flh.create(Util.nextId());
          fatura.setSemana(semana);
          fatura.setIdProjeto(proj);
          fatura.setPrecoTotal(precoTotal);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

  public void fecharProjeto(String idProjeto) {
      try {
      } catch (Exception e) {

      }
  }

  public Collection verificarRequisicoes(int semana) {
      try {
        Vector vec = new Vector();
        RequerimentoHoraExtraLocalHome home = Util.getRequerimentoHoraExtraHome();
        Collection res = home.findBySemana(semana);
        Iterator it = res.iterator();
        while(it.hasNext()){
            RequerimentoHoraExtraLocal req = (RequerimentoHoraExtraLocal) it.next();
            vec.add(new RequerimentoHoraExtraFacade(req));
        }
        return vec;
      } catch (Exception e) {
          e.printStackTrace();
          return null;
      }
  }

  public Collection getProjetos() {
      try {
        Vector vec = new Vector();
        ProjetoLocalHome home = Util.getProjetoHome();
        Vector v = new Vector();
        Vector projs = new Vector(home.findAllItems());

        for (int i = 0; i < projs.size(); ++i) {
          ProjetoLocal proj = (ProjetoLocal)projs.elementAt(i);
          v.add(new ProjetoFacade(proj));
        }

        return v;
      } catch (Exception e) {
          e.printStackTrace();
          return null;
      }
  }

  public void aceitarRequerimento(RequerimentoHoraExtraFacade requerimento) {
    try {
      int semana = requerimento.getSemana();
      int horas = requerimento.getQuantidadeHoras();
      String idFunc = requerimento.getIdFuncionario();
      FuncionarioLocal func = Util.getFuncionarioHome().findByPrimaryKey(idFunc);
      ProjetoLocal proj = func.getIdProjeto();

      CargaSemanalFuncionarioLocal csf = null;
      Vector v = new Vector(func.getCargaSemanalFuncionarioCollection());
      for (int i = 0; i < v.size(); ++i) {
        CargaSemanalFuncionarioLocal csft = (CargaSemanalFuncionarioLocal)v.elementAt(i);
        if (csft.getSemana() == semana) {
          csf = csft;
          break;
        }
      }

      int new_horas = csf.getCargaExtra() + horas;

      if (new_horas > proj.getLimiteCargaExtraPorFuncionario()) {
        MensagemLocalHome homeMsg = Util.getMensagemHome();
        MensagemLocal msg = homeMsg.create(Util.nextId());
        msg.setIdFuncionario(func);
        msg.setIdGerente(Util.getGerenteHome().findByPrimaryKey(proj.getIdGerente()));
        msg.setAviso("Requerimento de hora extra ultrapassou limite do funcionário");
      }
      else {
        csf.setCargaExtra(new_horas);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void recusarRequisicao(RequerimentoHoraExtraFacade fac) {
      try {
        Util.getRequerimentoHoraExtraHome().remove(fac.getId());

        FuncionarioLocal func = Util.getFuncionarioHome().findByPrimaryKey(fac.getIdFuncionario());
        MensagemLocalHome msgHome = Util.getMensagemHome();
        MensagemLocal msg = msgHome.create(Util.nextId());

        msg.setIdFuncionario(func);
        msg.setAviso("Requerimento " + fac.getId() + " foi negado");
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

}
